package rtool

import "cmp"

// SplitPage 切片分页，将一个切片，按页大小进行分页
// 返回pageSize的分页列表，最后一页不足pageSize作最后一页。
func SplitPage[T cmp.Ordered](src []T, pageSize int) [][]T {
	pageList, other := SplitPageTrunc(src, pageSize)
	if other == nil {
		return pageList
	}
	return append(pageList, other)
}

// SplitPageTrunc 切片分页，将一个切片，按页大小进行分页
// 返回满pageSize的分页列表和多余部分（不足pageSize）的切片。
func SplitPageTrunc[T cmp.Ordered](src []T, pageSize int) ([][]T, []T) {
	var rt [][]T
	var temp []T
	for _, d := range src {
		temp = append(temp, d)
		if len(temp) == pageSize {
			rt = append(rt, temp[:])
			temp = nil
		}
	}
	return rt, temp
}

// SplitPageFill 切片分页，将一个切片，按页大小进行分页
// 返回满pageSize的分页列表，如果最后一页不足pageSize将自动填充默认值defValue的元素。
func SplitPageFill[T cmp.Ordered](src []T, pageSize int, defValue T) [][]T {
	pageList, other := SplitPageTrunc(src, pageSize)
	if other == nil {
		return pageList
	}
	length := len(other)
	for i := 0; i < pageSize-length; i++ {
		other = append(other, defValue)
	}
	return append(pageList, other)
}
